/* Clase Caja
 * Caja que el pj puede empujar.
 */

package source.Objetos 
{
    import net.flashpunk.graphics.Image;
    import net.flashpunk.Sfx;
    import net.flashpunk.utils.Input;
    import source.Assets;
    import source.Global;

	public class Caja extends Physics {
        public const sfxArrastre:Sfx = new Sfx(Assets.SFX_CAJA);
		public var timer:uint = Global.cajaTiempoEmpuje; //para comprobar cuánto tiempo ha estado empujando el pj ANTES de empezar a moverse
		public var pushing:int; //la dirección por la que empuja el pj (0 = ninguna, -1 = izquierda, 1 = derecha)
		public var moving:Boolean = false; //si se está moviendo
		public var movement:Number = 2; //la velocidad de la caja cuando está siendo empujada (no debería ser mayor que la del pj)
		
		public function Caja(x:int, y:int) {
			super(x, y);
			
			graphic = new Image(Assets.OBJ_CAJA);
			type = "Solid";
			
			setHitbox(25, 25, 0, 0);
		}
		
		override public function update():void {
			//only move vertically here
			motion(false, true);
			gravity();
            
            //Gestión del agua, gravedad y velocidad máxima según habilidad de correr y si el pj está en el agua:
			if (collide("Agua", x, y))
                mGravity = Global.gravedad_enAgua;
			else
				mGravity = Global.gravedad_enAire;
			
			//check if we're being pushed
			pushing = 0;
			if (collide("PJ", x + 1, y) && Input.check("Izq") && Global.pj.empujar)
                pushing = -1;
			else if (collide("PJ", x - 1, y) && Input.check("Dch") && Global.pj.empujar)
                pushing = 1;
			
			//if we're being pushed, count the timer down
			if (pushing) {
				if (timer > 0) timer--;
				else if (timer < 1) moving = true; //start moving if timer has hit bottom
			}
			
			//if we're moving
			if (moving) {
				if (pushing) {
                    speed.x = movement * pushing; //if we're still being pushed, set our speed
                    if (!sfxArrastre.playing) {
                        sfxArrastre.play();
                        sfxArrastre.loop();
                    }
                }
				motion(true, false);              //update our position
				Global.pj.motion(true, false);    //update the player position
				
				//no longer being pushed
				if (!pushing) {
					timer = 30;
					moving = false;
				}
			}
			
			//slide to a stop if we're not moving
			if (!moving) { 
				friction(true, false); 
				motion(true, false);
                if (sfxArrastre.playing) sfxArrastre.stop();
			}
		}
        
        override public function removed():void {
            if (sfxArrastre.playing) sfxArrastre.stop();
        }
	}
}